from typing import Union, Any
from django.shortcuts import render
from django.views import generic
from django.http import HttpResponse, JsonResponse, HttpResponseRedirect
from django.core.handlers.wsgi import WSGIRequest
from django.urls import reverse

from product.utils import utils


class HomePageDisplay(generic.View):
    """ Показываем домашнюю страницу """
    def get(self, request):
        return HttpResponseRedirect(reverse('product:list_of_products'))


class Product(generic.View):
    """ Обрабатываем запросы связанные с продуктом """

    def get(self, request: WSGIRequest, pk: int) -> Union[HttpResponse, JsonResponse]:
        result = utils.ProductUtils().get_template_for_displaying_single_product(request, pk)
        return result


class ListOfProducts(generic.View):
    """ Обрабатываем запросы связанные со списком продуктов """

    def get(self, request: WSGIRequest) -> Union[HttpResponse, JsonResponse]:
        result = utils.ProductUtils().get_template_for_displaying_list_of_products(request)
        return result


class Buy(generic.View):
    """ Обрабатываем запросы связанные с покупкой чего-то """

    def post(self, request, pk) -> Any:
        result = utils.BuyUtils().perform_necessary_action(request, pk)
        return result


class ShowResultOfBuy(generic.View):
    """ Показываем результат покупки """

    def get(self, request: WSGIRequest) -> Any:
        return utils.ShowResultOfBuyUtils().get_necessary_information(request)


class Cart(generic.View):
    """ Обрабатываем запросы связанные с корзиной """

    def get(self, request: WSGIRequest) -> Any:
        return utils.CartUtils().get_necessary_information(request)

    def post(self, request: WSGIRequest) -> Any:
        return utils.CartUtils().perform_necessary_action(request)
